//package cn.changein.framework.config;
//
//
//import com.fasterxml.jackson.annotation.JsonAutoDetect;
//import com.fasterxml.jackson.annotation.PropertyAccessor;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.Primary;
//import org.springframework.data.redis.connection.RedisConnectionFactory;
//import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
//import org.springframework.data.redis.core.StringRedisTemplate;
//import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
//import org.springframework.data.redis.serializer.StringRedisSerializer;
//import redis.clients.jedis.JedisPoolConfig;
//
///**
//
// */
//
//@Configuration
//class RedisConfig {
//
//    @Value("${spring.redis.database}")
//    private int dbIndex;
//
//    @Value("${spring.redis.host}")
//    private String host;
//
//    @Value("${spring.redis.port}")
//    private int port;
//
//    @Value("${spring.redis.password:}")
//    private String password;
//
//    @Value("${spring.redis.timeout}")
//    private int timeout;
//
//    @Value("${spring.jedis.pool.max-active}")
//    private int redisPoolMaxActive;
//
//    @Value("${spring.jedis.pool.max-wait}")
//    private int redisPoolMaxWait;
//
//    @Value("${spring.jedis.pool.max-idle}")
//    private int redisPoolMaxIdle;
//
//    @Value("${spring.jedis.pool.min-idle}")
//    private int redisPoolMinIdle;
//
//    /**
//     * 创建redis连接工厂
//     *
//     * @param dbIndex
//     * @param host
//     * @param port
//     * @param password
//     * @param timeout
//     * @return
//     */
//    public RedisConnectionFactory createJedisConnectionFactory(int dbIndex, String host, int port, String password, int timeout) {
//        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
//        jedisConnectionFactory.setDatabase(dbIndex);
//        jedisConnectionFactory.setHostName(host);
//        jedisConnectionFactory.setPort(port);
//        if (!StringUtils.isEmpty(password)) {
//            jedisConnectionFactory.setPassword(password);
//        }
//        jedisConnectionFactory.setTimeout(timeout);
//        jedisConnectionFactory.setPoolConfig(setPoolConfig(redisPoolMaxIdle, redisPoolMinIdle, redisPoolMaxActive, redisPoolMaxWait, true));
//        return jedisConnectionFactory;
//    }
//
//    /**
//     * 设置连接池属性
//     *
//     * @param maxIdle
//     * @param minIdle
//     * @param maxActive
//     * @param maxWait
//     * @param testOnBorrow
//     * @return
//     */
//    public JedisPoolConfig setPoolConfig(int maxIdle, int minIdle, int maxActive, int maxWait, boolean testOnBorrow) {
//        JedisPoolConfig poolConfig = new JedisPoolConfig();
//        poolConfig.setMaxIdle(maxIdle);
//        poolConfig.setMinIdle(minIdle);
//        poolConfig.setMaxTotal(maxActive);
//        poolConfig.setMaxWaitMillis(maxWait);
//        poolConfig.setTestOnBorrow(testOnBorrow);
//        return poolConfig;
//    }
//
//    @Primary
//    @Bean("stringRedisTemplate")
//    public StringRedisTemplate stringRedisTemplate() {
//        StringRedisTemplate template = new StringRedisTemplate();
//        template.setConnectionFactory(createJedisConnectionFactory(dbIndex, host, port, password, timeout));
//        //默认的StringRedisTemplate 默认支持 StringSerializer ,只能序列化 String类型的数据。而Jackson2JsonRedisSerializer支持多种数据类型
//        Jackson2JsonRedisSerializer jsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
//
//        ObjectMapper objectMapper = new ObjectMapper();
//        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
//
//        jsonRedisSerializer.setObjectMapper(objectMapper);
//
//        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//        template.setKeySerializer(stringRedisSerializer);
//        template.setHashKeySerializer(jsonRedisSerializer);
//        template.setHashValueSerializer(stringRedisSerializer);
//        return template;
//    }
//
//}
//
